Zeile je nach Feldwert komplett färben

Bei Excel-Listen gibt es häufig die Anforderung, eine komplette Zeile abhängig von einem bestimmten Feldwert in dieser Zeile einzufärben. Das geht mit Hilfe der bedingten Formatierung. Allerdings ist diese Lösung meine Erachtens sehr komplex, unübersichtlich und schlecht zu warten.

Aus diesem Grund habe ich ein kleines Visual-Basic-Script geschrieben, mit dessen Hilfe das Einfärben einer Zeile einfach und nachvollziehbar funktioniert. Die Zeilenfarbe soll abhängig vom Status sein.

Statustabelle

Hierfür füge die folgende Tabelle ein:

Um die Tabelle zu erstellen, trage die Werte wie aus dem Screenshot ersichtlich in die Zellen ein und klicke auf Einfügen – Tabelle. Dann markiere den Bereich:

Du hast nun die Tabelle erstellt. Mit dieser Tabelle definieren wir den die Farbe der einzelnen Status.

Liste

Ausgangsbasis soll eine kleine Liste sein. Erstelle diese Liste ebenfalls als Tabelle und erstelle die Datenüberprüfung vom Typ Liste für das Feld Status. Wie das geht, ist in diesem Artikel beschrieben.

VBA

Wir erstellen nun eine kleine Visual-Basic-Routine, die bei jeder Änderung des Arbeitsblattes ausgeführt wird. Öffne in den Entwicklertools (muss gegebenenfalls in den Excel-Optionen aktiviert werden!) den Visual Basic Editor und füge für das Arbeitsblatt mit der Liste den folgenden Code ein:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim l_column As Integer
 Dim l_color As Integer
 Dim l_status_row As Integer
 Dim l_status_col As Integer
 Dim l_number_of_columns_to_color As Integer

''' Anzahl der einzufärbenden Spalten
 l_number_of_columns_to_color = 3
''' Index der Spalte, in der der Status definiert wurde
 l_status_col = 1

 If Target.Column = 2 Then

 For l_status_row = 1 To 20

 If Worksheets("Status").Cells(l_status_row, l_status_col).Value = Cells(Target.Row, Target.Column).Value Then
 On Error GoTo NOT_AN_INTEGER
 l_color = CInt(Worksheets("Status").Cells(l_status_row, l_status_col + 1).Value)
 Exit For
NOT_AN_INTEGER:
 l_color = 0
  End If
 Next l_status_row

 For l_column = 1 To l_number_of_columns_to_color
 Cells(Target.Row, l_column).Interior.ColorIndex = l_color
 Next l_column
 End If

End Sub

[notice type=’alert’]Achte darauf, dass der im Coding verwendete Name für das Arbeitsblatt Worksheets(“Status”) mit deinem überein stimmt![/notice]

[notice type=’info’]Die Arbeitsmappe enthält nun Coding und kann nicht mehr als normale Excel-Datei gespeichert werden. Du musst sie als XLSM-Datei (Excel-Arbeitsmappe mit Makros) speichern:

[/notice]

Anmerkungen

Die Farbe der Zeilen wird nicht automatisch geändert, wenn der Farbindex in der Statustabelle geändert wird!

Die Farbe wird neu gesetzt, sobald ein Status ausgewählt wird. Möchte man sicher sein, dass eine Zeile immer komplett eingefärbt ist, dann kann die Codezeile

If Target.Column = 2 Then

und das entsprechende End If am Ende des Codings entfernt werden. In diesem Fall wird bei jeder Änderung in der Tabelle die Farbe für die Tabellenzeile neu gesetzt.

Die Anzahl der einzufärbenden Zellen muss im Coding angepasst werden. Werden Spalten an die Liste angehängt, dann muss der Wert l_number_of_columns_to_color angepasst werden.

Enno Wulff